let aGoods = {
  pic: '.',
  title: '..',
  desc: `...`,
  sellNumber: 1,
  favorRate: 2,
  price:3
}

class UIGoods {
  get totalPrice(){
    return this.data.price * this.choose
  }

  get isChoose() {
    return this.choose > 0
  }
  constructor(g) {
    g = { ...g }
    Object.freeze(g) // Object.freeze(g) 被调用在 UIGoods 类的构造函数中，其目的是对传入的对象 g 进行冻结，确保 g 的内容在实例化后不会被外部代码修改。
    Object.defineProperty(this, 'data', {
      get: function () {
        return g;
      },
      set: function () {
        throw new Error('data属性是只读的，不能重新赋值')
      },
      configurable: false
    });
    let internalChooseValue = 0
    Object.defineProperty(this, 'choose', {
      configurable: false,
      get: function () {
        return internalChooseValue
      },
      set: function (val) {
        if (typeof val !== 'number') {
          throw new Error('choose属性必须是数字')
        }
        let temp = parseInt(val)
        if (temp !== val) {
          throw new Error('choose属性必须是整数')
        }
        if (val < 0) {
          throw new Error('choose属性必须大于0')
        }
        internalChooseValue = val
      }
    })
    this.a = 1
    Object.seal(this) // Object.seal() 并不会阻止对现有属性值的修改（如果属性是可写的
  }
}

Object.freeze(UIGoods.prototype)

let g = new UIGoods(aGoods)
UIGoods.prototype.haha = 2
g.choose = 2
console.log(g.totalPrice)
console.log(g.haha)
